#ifndef __RANGE_H__
#define __RANGE_H__

#include <Condition.h>
#define TEMPLATE_RANGE template<int _min, int _max, typename FixedFloat>

TEMPLATE_RANGE
struct OpenRange
{
    bool
    operator()(const FixedFloat&) const;
};

TEMPLATE_RANGE bool
OpenRange<_min,_max,FixedFloat>::operator()(const FixedFloat& input)const
{
    FixedFloat min(_min),max(_max);
    return input>min&&input<max;
}

TEMPLATE_RANGE
struct CloseRange
{
    bool
    operator()(const FixedFloat&) const;
};

TEMPLATE_RANGE bool
CloseRange<_min,_max,FixedFloat>::operator()(const FixedFloat& input)const
{
    FixedFloat min(_min),max(_max);
    return input>=min&&input<=max;
}

TEMPLATE_RANGE
struct LeftOpenRightCloseRange
{
    bool
    operator()(const FixedFloat&) const;
};

TEMPLATE_RANGE bool
LeftOpenRightCloseRange<_min,_max,FixedFloat>::operator()(const FixedFloat& input)const
{
    FixedFloat min(_min),max(_max);
    return input>min&&input<=max;
}

TEMPLATE_RANGE
struct LeftCloseRightCloseRange
{
    bool
    operator()(const FixedFloat&) const;
};

TEMPLATE_RANGE bool
LeftCloseRightCloseRange<_min,_max,FixedFloat>::operator()(const FixedFloat& input)const
{
    FixedFloat min(_min),max(_max);
    return input>=min&&input<max;
}


#endif

